Base64

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Base64 — стандарт кодирования двоичных данных при помощи только 64 символов ASCII. Алфавит кодирования содержит латинские символы A-Z, a-z, цифры 0-9 (всего 62 знака) и 2 дополнительных символа, зависящих от системы реализации. Каждые 3 исходных байта кодируются четырьмя символами (увеличение на ¹⁄₃).

Эта система широко используется в электронной почте для представления бинарных файлов в тексте письма (транспортное кодирование).

В формате электронной почты MIME Base64 — это схема, по которой произвольная последовательность байтов преобразуется в последовательность печатных ASCII-символов.

Стандартные 62 символа дополняют +, / и = — в качестве специального кода суффикса.

Полная спецификация этой формы Base64 содержится в RFC 1421 и RFC 2045. Эта схема используется для кодирования последовательности октетов (байтов).

Для того чтобы преобразовать данные в Base64, первый байт помещается в самые старшие восемь битов 24-битного буфера, следующий — в средние восемь и третий — в младшие восемь битов. Если кодируется менее чем три байта, то соответствующие биты буфера устанавливаются в ноль. Далее каждые шесть битов буфера, начиная с самых старших, используются как индексы строки «ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/», и её символы, на которые указывают индексы, помещаются в выходную строку. Если кодируется только один или два байта, в результате получаются только первые два или три символа строки, а выходная строка дополняется двумя или одним знаком =. Это предотвращает добавление дополнительных битов к восстановленным данным. Процесс повторяется над оставшимися входными данными. При кодировании Base64 размер сообщения увеличивается приблизительно на 33 %. Это надо учитывать, если есть ограничения на размер конечного сообщения. Так, при максимально допустимом размере 64 МБ реальный размер передаваемого сообщения должен быть не более 48 МБ[1].

Например, цитата из «Левиафана» Томаса Гоббса:

Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.

будучи перекодированной из ASCII в Base64, выглядит следующим образом:

TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0
aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1
c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0
aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdl
LCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=

В примере, слово Man закодировано как TWFu. Процесс преобразования можно представить в виде следующей таблицы:

Исходный текст M a n
Коды ASCII 77 (0x4d) 97 (0x61) 110 (0x6e)
Двоичный вид 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0
Полученный индекс в Base64 19 22 5 46
Конечный результат в Base64 T W F u

Схема соответствия «символ — значение» в Base64

[править | править код]
Символ Значение Символ Значение Символ Значение Символ Значение
10 2 8 16 10 2 8 16 10 2 8 16 10 2 8 16
A 0 000000 00 00 Q 16 010000 20 10 g 32 100000 40 20 w 48 110000 60 30
B 1 000001 01 01 R 17 010001 21 11 h 33 100001 41 21 x 49 110001 61 31
C 2 000010 02 02 S 18 010010 22 12 i 34 100010 42 22 y 50 110010 62 32
D 3 000011 03 03 T 19 010011 23 13 j 35 100011 43 23 z 51 110011 63 33
E 4 000100 04 04 U 20 010100 24 14 k 36 100100 44 24 0 52 110100 64 34
F 5 000101 05 05 V 21 010101 25 15 l 37 100101 45 25 1 53 110101 65 35
G 6 000110 06 06 W 22 010110 26 16 m 38 100110 46 26 2 54 110110 66 36
H 7 000111 07 07 X 23 010111 27 17 n 39 100111 47 27 3 55 110111 67 37
I 8 001000 10 08 Y 24 011000 30 18 o 40 101000 50 28 4 56 111000 70 38
J 9 001001 11 09 Z 25 011001 31 19 p 41 101001 51 29 5 57 111001 71 39
K 10 001010 12 0A a 26 011010 32 1A q 42 101010 52 2A 6 58 111010 72 3A
L 11 001011 13 0B b 27 011011 33 1B r 43 101011 53 2B 7 59 111011 73 3B
M 12 001100 14 0C c 28 011100 34 1C s 44 101100 54 2C 8 60 111100 74 3C
N 13 001101 15 0D d 29 011101 35 1D t 45 101101 55 2D 9 61 111101 75 3D
O 14 001110 16 0E e 30 011110 36 1E u 46 101110 56 2E + 62 111110 76 3E
P 15 001111 17 0F f 31 011111 37 1F v 47 101111 57 2F / 63 111111 77 3F

UTF-7 представляет собой изменённый вариант Base64. Эта схема кодирования используется для файлов UTF-16 как промежуточный формат в MIME. UTF-7 предназначен для использования Юникода в электронной почте без транспортного кодирования содержимого. Главное отличие этого варианта Base64 от MIME в том, что символ = не используется для дополнения, так как требуется многократное экранирование этого символа. Вместо этого биты октета дополняются нулями.

Изменённый Base64 стандартизирован по RFC 2152 (A Mail-Safe Transformation Format of Unicode).

В протоколе «сервер-сервер», используемом в IRC и совместимом программном обеспечении, версия Base64 используется для кодирования клиент-серверных числовых и двоичных IP-адресов. Клиентские и серверные числовые данные имеют фиксированные размеры, которые точно совпадают с количеством знаков Base64, поэтому нет необходимости в дополнении. Двоичные IP-адреса для соответствия расширяются ведущими нулевыми битами. Набор символов незначительно отличается от MIME использованием [] вместо +/.

Применение в веб-приложениях

[править | править код]

Благодаря Base64 в html-документы можно включать бинарный контент, создавая единый документ без отдельно расположенных картинок и прочих дополнительных файлов. Таким образом, html-документ с включённой в него графикой, аудио, видео, программами, стилями и прочими дополнениями становится прекрасной альтернативой другим форматам сложнооформленных документов типа doc, docx, pdf.

Некоторые приложения кодируют двоичные данные для удобства включения в URL, скрытые поля форм.

Использование URL-кодировщика над стандартом Base64 не всегда удобно, так как он преобразует символы / и + в специальные шестнадцатеричные последовательности. Несмотря на то, что это преобразование обратимо, оно удлиняет строку и немного усложняет её последующий разбор. Кроме того, символ %, сгенерированный URL-кодировщиком, может потребоваться экранировать ещё раз при последующей передаче получившейся строки через другие системы (например, в SQL это элемент шаблона).

По этой причине существует изменённый Base64 для URL, где не используется заполнение знаком =, а символы + и / соответственно заменяются на * и -. Поэтому использование кодеров/декодеров URL перестаёт быть необходимым и не имеет никакого воздействия на длину закодированного значения, оставляя ту же самую закодированную форму, не повреждённую для использования в реляционных базах данных, веб-формах и идентификаторах объекта вообще. Стандартом Base64-кодирования URL адресов признаётся вариант, когда символы + и / заменяются на - и _ соответственно (RFC 3548, раздел 4).

Другой вариант называется изменённый Base64 для регулярных выражений и использует ! и - вместо * и - для того, чтобы заменить стандартный Base64 +/, потому что оба + и * могут быть зарезервированы для регулярных выражений (отметим, что [], используемые выше в IRCu-варианте, могут не работать в этом контексте).

Имеются другие варианты, которые используют _ и - или . и _, если строка Base64 должна быть использована вместе с идентификаторами для программ, или . и - для использования в токенах имён XML (Nmtoken), или _ и : в более ограниченных идентификаторах XML (Name). В некоторых случаях для URL применяется Base58, который не использует символы + и /.

Для кодирования URL в некоторых системах используется Base58, отличающаяся от Base64 отсутствием в конечном тексте символов, которые могут восприниматься человеком неоднозначно. Исключены 0 (ноль), O (заглавная латинская o), I (заглавная латинская i), l (маленькая латинская L). Также исключены символы + (плюс) и / (косая черта), которые при кодировании URL могут приводить к неверной интерпретации адреса.

Radix-64 — разновидность кодирования Base64 двоичных данных в текстовый формат, используемая в PGP. От Base64 отличается тем, что в конец добавляется контрольная сумма в 24 бита.

Операционные системы семейства Unix сохраняют вычисленные с помощью crypt хеши паролей в файл /etc/passwd, используя кодировку B64. Она похожа на Radix-64, но суффикс выравнивания = не используется и в алфавите небуквенные символы расположены в начале: ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.

Другие применения

[править | править код]

Существует множество вариантов применения Base64. Например, Thunderbird и Mozilla Suite использовали Base64 для сокрытия паролей в POP3. Base64 может использоваться как метод для сокрытия секретов без издержек на криптографическое управление ключами, однако этот подход является абсолютно небезопасным и не рекомендуется к использованию.

Сканеры спама, которые не декодируют сообщения в Base64, часто пропускают их, так как такие сообщения кажутся достаточно случайными, чтобы быть принятыми за спам. Это используют спамеры для обхода основных антиспамовых инструментов.

Данный стандарт применяется для кодирования изображений формата JPEG и PNG[2] с целью вставки их в электронные книги формата FB2[3].

Существуют приложения, использующие кодировку Base64 для отправки небольших изображений посредством длинных[англ.] SMS[4].

Примечания

[править | править код]
  1. AshaIyengar21 Настройка ограничений размера сообщений для определенного клиента (рус.). learn.microsoft.com (4 апреля 2023). Дата обращения: 14 июля 2023. Архивировано 14 июля 2023 года.
  2. Закодировать файл изображения с помощью Base64 (англ.). Base64 Online (21 марта 2024).
  3. Элемент binary — FictionBook. fictionbook.org. Дата обращения: 23 сентября 2019. Архивировано 22 сентября 2019 года.
  4. Image SMS | F-Droid - Free and Open Source Android App Repository. f-droid.org. Дата обращения: 23 апреля 2021. Архивировано 23 апреля 2021 года.

Онлайн кодирование и декодирование

[править | править код]